<?php

  /** Classe gerant la session & l'authentification de l'utilisateur.
	 * Le nom de 'Login' vient du fait qu'elle est activee par le login.
	 * @author Sebastian Mosser
	 * @date 2006
	 * @version 1.0
 	 */
  
class Login {

	/// Texte a afficher si personne n'est identifie
	const NOBODY = "Visiteur Anonyme";
	/// Code interne definissant l'utilisateur anonyme
	private static $unknownId = -1;
	// Constante interne decrivant le fait de n'avoir acces a aucun services.
	public static $NO_SERVICES = -1;

	/** Determine si l'utilisateur est valide pour le systeme.
	 * @param $login son nom de login
	 * @param $password sont mot de passe sous forme MD5.
	 * @return True si le login est valide, False sinon.
	 * @warning si le login est valide, on initialise la session per effet de bord
	 */
	public static function isGranted($login,$password) {
		$answer = Database::assoc(User::lookOnLogin($login));
		if (! $answer)
			return False;
		if ($answer["passwd"] == $password) {
			self::subscribe($answer["id"]);
			return True;
		}
		return False;
	}

	/** Detruit la session d'un utilisateur identifie.
	 * @warning la session est reellement DETRUITE !
	 */
	public static function logout() {
		self::unSubscribe();
		session_destroy();
	}
	
	/** Initialise la session d'un utilisateur.
	 * @param $userId l'identifiant de l'utilisatuer qui souscrit une session.
	 */
	public static function subscribe($userId) {
	  $myUser = User::read($userId);
		$_SESSION["userLogin"]  = $myUser->getLogin()  ;
		$_SESSION["userId"]     = $myUser->getId()     ;
		$_SESSION["userGroups"] = $myUser->getGroups() ;
		$myServices = ToCGenerator::generate($myUser->getGroups());
		$_SESSION["userServices"] = gzcompress($myServices);
		$_SESSION["lastInsertTuple"] = array();
		$_SESSION["lastInsertTuple"]["ClassName"] = "";
		$_SESSION["lastInsertTuple"]["LastId"] = "";
		$_SESSION["season"] = Season::getLastSeason();
	}
	
	/** Detruit toutes les variables de session courantes.
	 */
	public static function unSubscribe() {
		unset($_SESSION["userLogin"]) ;
		unset($_SESSION["userId"])    ;
		unset($_SESSION["userGroups"]);
		unset($_SESSION["userServices"]);
		unset($_SESSION["lastInsertTuple"]);
		unset($_SESSION["season"]);
	}	
	
	/** Permet d'obtenir le nom de login de la personne identifiee.
	 * @return la chaine de caracteres ad'hoc ou \ref $NOBODY.
	 */
	public static function getLoginName() {
		return (empty($_SESSION["userLogin"]) ? 
						self::NOBODY : 
						$_SESSION["userLogin"]);
	}
	
	/** Permet d'obtenir l'identifiant de l'utilisateur identifie.
	 * @return l'identifiant ad'hoc ou \ref $unknownId.
	 */
	public static function getLoginId() {
		return (empty($_SESSION["userId"]) ? 
						self::$unknownId : 
						$_SESSION["userId"]);
	}
	
	/** Obtention des groupes de l'utilisateur identifie.
	 * @return un table de groupes, ou un tableau vide.
	 */
	public static function getGroups() {
	   return (empty($_SESSION["userGroups"]) ? 
	   				 array() : 
	   				 $_SESSION["userGroups"]);
	}
	
	/** Renvoi la liste des services de l'utilisateur.
	 * @warning Cette liste est stockee en session pour eviter des appels disques.
	 * @return une liste HTML ad'hoc, ou \ref $NO_SERVICES sinon.
	 */
	public static function getMyServices() {
	   return (empty($_SESSION["userServices"]) ? 
	   				 self::$NO_SERVICES : 
	   				 gzuncompress($_SESSION["userServices"]));
	}
	
	/** Determine si quelqu'un est identifiee sur le systeme.
	 * @return un booleen.
	 */
	public static function isSomeoneLoggedIn() {
		if (self::getLoginId() != self::$unknownId)
		   $ans = True;
		else
		   $ans = False;
		return $ans;
	}
	
	/** Permet de logguer la derniere insertion faite par l'utilisateur.
	 * @param $array[0] le nom de la classe qui a ete inseree
	 * @param $array[1] l'identifiant de l'instance inseree.
	 * @warning cela permet d'eviter la double insertion au rafraichissement.
	 * @return si $array est a False, on renvoi le dernier ajout effectue
	 */
	public static function lastInsert($array = False) {
		$values = PropRetriever::getArray($_SESSION,"lastInsertTuple");
		if ($array == False)
			return $values;
		$_SESSION["lastInsertTuple"]["ClassName"] = $array[0];
		$_SESSION["lastInsertTuple"]["LastId"] = $array[1];
	}
	
	/** Renvoi la saison de l'utilisateur, ou la met a jour
	 * @param $s la nouvelle saison choisie
	 * @return si $s est a False, on renvoi la saison courante;
	 */
	public static function seasonChoosen($s = False) {
		if ($s === False)
			if (empty($_SESSION["season"]))
				return Season::$NO_SEASON;
			else
				return $_SESSION["season"];
		else
			$_SESSION["season"] = $s;
	}
	
	/** Pour savoir si l'utilisateur est dans un groupe donné **/
	public static function isInGroup($groupId) {
		$groups = self::getGroups();
		return array_key_exists($groupId,$groups);
	}
	
}

?>